home *** CD-ROM | disk | FTP | other *** search
/ Aminet 12 / Aminet 12 (1996)(GTI - Schatztruhe)[!][Jun 1996].iso / Aminet / gfx / misc / SafeClip.lha / SafeClip / GCC / clip.s < prev    next >
Text File  |  1996-03-29  |  8KB  |  356 lines

  1. |
  2. | Name:        clip.s 
  3. | Description: Routines for clipping line segments and filled polygons
  4. | Author:      pak@star.sr.bham.ac.uk (Peter Knight)
  5. | Notes:       Requires 68020+
  6. |
  7.  
  8. .EXPORT    _lineclip
  9. .EXPORT    _clip2d
  10. .EXPORT _CLP_xmin
  11. .EXPORT _CLP_ymin
  12. .EXPORT _CLP_xmax
  13. .EXPORT _CLP_ymax
  14.  
  15. | Clip to x boundary
  16. .MACRO  CLIPX
  17.         movem.l (a0),d2-d5              | get (x1,y1) and (x2,y2)
  18.         sub.l   d2,d4                   | x2-x1
  19.         sub.l   d3,d5                   | y2-y1
  20.         sub.l   d6,d2                   | x1-xint
  21.         muls.l  d2,d7:d5
  22.         divs.l  d4,d7:d5
  23.         sub.l   d5,d3                   | y intercept
  24.         move.l  d6,(a1)+                | save x intercept
  25.         move.l  d3,(a1)+                | save y intercept
  26. .ENDM
  27.  
  28. | Clip to y boundary
  29. .MACRO  CLIPY
  30.         movem.l (a0),d2-d5              | get (x1,y1) and (x2,y2)
  31.         sub.l   d2,d4                   | x2-x1
  32.         sub.l   d3,d5                   | y2-y1
  33.         sub.l   d6,d3                   | y1-xint
  34.         muls.l  d3,d7:d4
  35.         divs.l  d5,d7:d4
  36.         sub.l   d4,d2                   | x intercept
  37.         move.l  d2,(a1)+                | save x intercept
  38.         move.l  d6,(a1)+                | save y intercept
  39. .ENDM
  40.  
  41. |                
  42. | lineclip - Clip line segment to viewport
  43. |
  44. | on entry:
  45. | a0.l - address of vertices.
  46. |
  47. | on exit:
  48. | d0.l - TRUE if some part of line drawn, else FALSE
  49. | all other registers preserved
  50. |
  51. _lineclip:
  52.         movem.l d1-d7/a0-a5,-(sp)       | Save registers.
  53.  
  54. | Bad return code
  55.     moveq    #0,d0
  56.  
  57. | Duplicate first end point
  58.     move.l    (a0),16(a0)
  59.     move.l    4(a0),20(a0) 
  60.  
  61. | Clip against xmin
  62.     move.l    _CLP_xmin,d6
  63.     cmp.l    (a0),d6
  64.     ble.s   ok1
  65.     cmp.l    8(a0),d6
  66.     bgt    quit
  67.     move.l    a0,a1
  68.     CLIPX
  69.     bra.s    ok2
  70. ok1:
  71.     cmp.l    8(a0),d6
  72.     ble.s    ok2
  73.     lea    8(a0),a1
  74.     CLIPX
  75.  
  76. | Clip against xmax
  77. ok2:
  78.     move.l    _CLP_xmax,d6
  79.     cmp.l    (a0),d6
  80.     bge.s    ok3
  81.     cmp.l    8(a0),d6
  82.     blt    quit
  83.     move.l    a0,a1
  84.     CLIPX
  85.     bra.s    ok4
  86. ok3:
  87.     cmp.l    8(a0),d6
  88.     bge.s    ok4
  89.     lea    8(a0),a1
  90.     CLIPX
  91.  
  92. | Clip against ymin
  93. ok4:
  94.     move.l    _CLP_ymin,d6
  95.     cmp.l    4(a0),d6
  96.     ble.s    ok5
  97.     cmp.l    12(a0),d6
  98.     bgt    quit
  99.     move.l    a0,a1
  100.     CLIPY
  101.     bra.s    ok6
  102. ok5:
  103.     cmp.l    12(a0),d6
  104.     ble.s    ok6
  105.     lea    8(a0),a1
  106.     CLIPY
  107.  
  108. | Clip against ymax
  109. ok6:
  110.     move.l    _CLP_ymax,d6
  111.     cmp.l    4(a0),d6
  112.     bge.s    ok7
  113.     cmp.l    12(a0),d6
  114.     blt    quit
  115.     move.l    a0,a1
  116.     CLIPY
  117.     bra.s    ok8
  118. ok7:
  119.     cmp.l    12(a0),d6
  120.     bge.s    ok8
  121.     lea    8(a0),a1
  122.     CLIPY
  123. ok8:
  124.     moveq    #1,d0
  125. quit:
  126.         movem.l (sp)+,d1-d7/a0-a5
  127.         rts
  128.  
  129.  
  130. |                
  131. | clip2d - Clip 2-d polygon to viewport
  132. |
  133. | on entry:
  134. | d0.w - number of vertices
  135. | a0.l - address of vertices.
  136. | a1.l - address of draw buffer.
  137. |
  138. | on exit:
  139. | d0.w - number of vertices in clipped polygon
  140. | all other registers preserved
  141. |
  142. _clip2d:
  143.         movem.l d1-d7/a0-a5,-(sp)       | Save registers.
  144.  
  145. | Save address of draw buffer.
  146.     move.l    a0,a5
  147.         move.l  a1,a4
  148.     exg    d0,d1
  149.         
  150. | Clip against xmin.
  151.         subq.w  #2,d1
  152.         move.w  d1,d0                   | d0 is from count
  153.         move.l    a5,a0                   | from buffer
  154.         move.l    a4,a1                   | to buffer is a1
  155.         moveq   #0,d1                   | d1 is to count
  156.         move.l  _CLP_xmin,d6            | d6 is XMIN.
  157.         cmp.l   (a0),d6
  158.         bge.s   xmin_loop
  159.         move.l  (a0),(a1)+
  160.         addq.w  #1,d1
  161.         move.l  4(a0),(a1)+
  162. xmin_loop:
  163.         cmp.l   (a0),d6
  164.         blt.s   xmin_over
  165.         cmp.l   8(a0),d6
  166.         bge.s   xmin_skip
  167.     CLIPX
  168.     addq.w    #1,d1
  169.         bra.s   xmin_next
  170. xmin_over:
  171.         cmp.l   8(a0),d6
  172.         blt.s   xmin_next
  173.     CLIPX
  174.     addq.w    #1,d1
  175.         bra.s   xmin_skip
  176. xmin_next:
  177.         lea     8(a0),a2
  178.         move.l  (a2)+,(a1)+
  179.         addq.w  #1,d1
  180.         move.l  (a2)+,(a1)+
  181. xmin_skip:
  182.         lea     8(a0),a0
  183.         dbra    d0,xmin_loop
  184.         tst.w   d1
  185.         beq     exit 
  186.     move.l    a4,a0
  187.         move.l  (a0)+,d5
  188.         move.l  (a0)+,d6
  189.         lea     -8(a1),a2
  190.         cmp.l   (a2)+,d5
  191.         bne.s   xmin_close
  192.         cmp.l   (a2)+,d6
  193.         beq.s   clipxmax
  194. xmin_close:
  195.         move.l  d5,(a1)+
  196.         addq.w  #1,d1
  197.         move.l  d6,(a1)+ 
  198.         
  199. | Clip against xmax.
  200. clipxmax:
  201.         subq.w  #2,d1
  202.         move.w  d1,d0                   | d0 is from count
  203.         move.l    a4,a0                   | from buffer
  204.         move.l    a5,a1                   | to buffer is a1
  205.         moveq   #0,d1                   | d1 is to count
  206.         move.l  _CLP_xmax,d6            | d6 is xmax
  207.         cmp.l   (a0),d6
  208.         blt.s   xmax_loop
  209.         move.l  (a0),(a1)+
  210.         addq.w  #1,d1
  211.         move.l  4(a0),(a1)+
  212. xmax_loop:
  213.         cmp.l   (a0),d6
  214.         bge.s   xmax_over
  215.         cmp.l   8(a0),d6
  216.         blt.s   xmax_skip
  217.     CLIPX
  218.     addq.w    #1,d1
  219.         bra.s   xmax_next
  220. xmax_over:
  221.         cmp.l   8(a0),d6
  222.         bge.s   xmax_next
  223.     CLIPX
  224.     addq.w    #1,d1
  225.         bra.s   xmax_skip
  226. xmax_next:
  227.         lea     8(a0),a2
  228.         move.l  (a2)+,(a1)+
  229.         addq.w  #1,d1
  230.         move.l  (a2)+,(a1)+
  231. xmax_skip:
  232.         lea     8(a0),a0
  233.         dbra    d0,xmax_loop
  234.         tst.w   d1
  235.         beq     exit    
  236.     move.l    a5,a0
  237.         move.l  (a0)+,d5
  238.         move.l  (a0)+,d6
  239.         lea     -8(a1),a2
  240.         cmp.l   (a2)+,d5
  241.         bne.s   xmax_close
  242.         cmp.l   (a2)+,d6
  243.         beq.s   clipymin
  244. xmax_close:
  245.         move.l  d5,(a1)+
  246.         addq.w  #1,d1
  247.         move.l  d6,(a1)+
  248.         
  249. | Clip against ymin.
  250. clipymin:
  251.         subq.w  #2,d1
  252.         move.w  d1,d0                   | d0 is from count
  253.         move.l    a5,a0                   | from buffer
  254.         move.l    a4,a1                   | to buffer is a1
  255.         moveq   #0,d1                   | d1 is to count
  256.         move.l  _CLP_ymin,d6            | d6 is ymin
  257.     cmp.l   4(a0),d6
  258.         bge.s   ymin_loop
  259.         move.l  (a0),(a1)+
  260.         addq.w  #1,d1
  261.         move.l  4(a0),(a1)+
  262. ymin_loop:
  263.         cmp.l   4(a0),d6
  264.         blt.s   ymin_over
  265.         cmp.l   12(a0),d6
  266.         bge.s   ymin_skip
  267.     CLIPY
  268.     addq.w    #1,d1
  269.         bra.s   ymin_next
  270. ymin_over:
  271.         cmp.l   12(a0),d6
  272.         blt.s   ymin_next
  273.     CLIPY
  274.     addq.w    #1,d1
  275.         bra.s   ymin_skip
  276. ymin_next:
  277.         lea     8(a0),a2
  278.         move.l  (a2)+,(a1)+
  279.         addq.w  #1,d1
  280.         move.l  (a2)+,(a1)+
  281. ymin_skip:
  282.         lea     8(a0),a0
  283.         dbra    d0,ymin_loop
  284.         tst.w   d1
  285.         beq     exit
  286.     move.l    a4,a0
  287.         move.l  (a0)+,d5
  288.         move.l  (a0)+,d6
  289.         lea     -8(a1),a2
  290.         cmp.l   (a2)+,d5
  291.         bne.s   ymin_close
  292.         cmp.l   (a2)+,d6
  293.         beq.s   clipymax
  294. ymin_close:
  295.         move.l  d5,(a1)+
  296.         addq.w  #1,d1
  297.         move.l  d6,(a1)+
  298.         
  299. | Clip against ymax.
  300. clipymax:
  301.         subq.w  #2,d1
  302.         move.w  d1,d0                   | d0 is from count
  303.         move.l  a4,a0                   | from buffer
  304.         move.l  a5,a1                   | to buffer is a1
  305.         moveq   #0,d1                   | d1 is to count
  306.         move.l  _CLP_ymax,d6            | d6 is ymax
  307.         cmp.l   4(a0),d6
  308.         blt.s   ymax_loop
  309.         move.l  (a0),(a1)+
  310.         addq.w  #1,d1
  311.         move.l  4(a0),(a1)+
  312. ymax_loop:
  313.         cmp.l   4(a0),d6
  314.         bge.s   ymax_over
  315.         cmp.l   12(a0),d6
  316.         blt.s   ymax_skip
  317.     CLIPY
  318.     addq.w    #1,d1
  319.         bra.s   ymax_next
  320. ymax_over:
  321.         cmp.l   12(a0),d6
  322.         bge.s   ymax_next
  323.     CLIPY
  324.     addq.w    #1,d1
  325.         bra.s   ymax_skip
  326. ymax_next:
  327.         lea     8(a0),a2
  328.         move.l  (a2)+,(a1)+
  329.         addq.w  #1,d1
  330.         move.l  (a2)+,(a1)+
  331. ymax_skip:
  332.         lea     8(a0),a0
  333.         dbra    d0,ymax_loop
  334.         tst.w   d1
  335.         beq.s   exit
  336.         move.l    a5,a0
  337.         move.l  (a0)+,d5
  338.         move.l  (a0)+,d6
  339.         lea     -8(a1),a2
  340.         cmp.l   (a2)+,d5
  341.         bne.s   ymax_close
  342.         cmp.l   (a2)+,d6
  343.         beq.s   exit
  344. ymax_close:
  345.         move.l  d5,(a1)+
  346.         addq.w  #1,d1
  347.         move.l  d6,(a1)+
  348.         
  349. | Restore registers and exit.
  350. exit:
  351.     move.l    d1,d0
  352.         movem.l (sp)+,d1-d7/a0-a5
  353.         rts
  354.  
  355. .END
  356.